<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="atUmq" id="atUmq"><span data-lake-id="u4cc4917e" id="u4cc4917e">典型回答</span></h1>
  <p data-lake-id="u1d51e17e" id="u1d51e17e"><span data-lake-id="u1ca01b90" id="u1ca01b90">Java中有8种基本数据类型，这些基本类型又都有对应的包装类。</span><span data-lake-id="u4fb52fb0" id="u4fb52fb0"><br><br></span></p>
  <table data-lake-id="YYbVa" id="YYbVa" margin="true" class="lake-table" style="width: 764px">
   <colgroup>
    <col width="97">
    <col width="180">
    <col width="112">
    <col width="116">
    <col width="259">
   </colgroup>
   <tbody>
    <tr data-lake-id="u6dc7510a" id="u6dc7510a">
     <td data-lake-id="u64f36780" id="u64f36780" style="background-color: rgb(249, 249, 249)">
      <p data-lake-id="u47e53a5f" id="u47e53a5f"><span data-lake-id="u78e85057" id="u78e85057">分类</span></p></td>
     <td data-lake-id="ub55a978d" id="ub55a978d" style="background-color: rgb(249, 249, 249)">
      <p data-lake-id="u56ad54a7" id="u56ad54a7" style="text-align: center"><span data-lake-id="u7ba7bc74" id="u7ba7bc74" class="lake-fontsize-9" style="color: rgb(85, 85, 85)">基本数据类型</span></p></td>
     <td data-lake-id="u3438c411" id="u3438c411" style="background-color: rgb(249, 249, 249)">
      <p data-lake-id="u5899e3a6" id="u5899e3a6" style="text-align: center"><span data-lake-id="u8dd44e03" id="u8dd44e03" class="lake-fontsize-9" style="color: rgb(85, 85, 85)">包装类</span></p></td>
     <td data-lake-id="u5ab2d73e" id="u5ab2d73e" style="background-color: rgb(249, 249, 249)">
      <p data-lake-id="u224e539c" id="u224e539c"><span data-lake-id="u9ecbdefc" id="u9ecbdefc">长度</span></p></td>
     <td data-lake-id="u7407edb8" id="u7407edb8" style="background-color: rgb(249, 249, 249)">
      <p data-lake-id="u1dff8746" id="u1dff8746"><span data-lake-id="u91fff88a" id="u91fff88a">表示范围</span></p></td>
    </tr>
    <tr data-lake-id="uac2c278b" id="uac2c278b">
     <td data-lake-id="u7b357604" id="u7b357604" style="vertical-align: middle">
      <p data-lake-id="uee1d9bbe" id="uee1d9bbe"><span data-lake-id="u029b4182" id="u029b4182">布尔型</span></p></td>
     <td data-lake-id="u98614861" id="u98614861" style="vertical-align: middle">
      <p data-lake-id="u02e54def" id="u02e54def"><span data-lake-id="u24647664" id="u24647664">boolean</span></p></td>
     <td data-lake-id="uc9798dcf" id="uc9798dcf" style="vertical-align: middle">
      <p data-lake-id="u5505f1f6" id="u5505f1f6"><span data-lake-id="u983d979e" id="u983d979e">Boolean</span></p></td>
     <td data-lake-id="u1278327c" id="u1278327c" style="vertical-align: middle">
      <p data-lake-id="u77cd5f8d" id="u77cd5f8d"><span data-lake-id="ub348c296" id="ub348c296">/</span></p></td>
     <td data-lake-id="ua334bbd3" id="ua334bbd3" style="vertical-align: middle">
      <p data-lake-id="u6a0455d5" id="u6a0455d5"><span data-lake-id="u627a96c9" id="u627a96c9">/</span></p></td>
    </tr>
    <tr data-lake-id="ue3884c26" id="ue3884c26">
     <td data-lake-id="u800bda02" id="u800bda02" rowspan="4" style="vertical-align: middle">
      <p data-lake-id="u1d3c9917" id="u1d3c9917"><span data-lake-id="u886493af" id="u886493af">整型</span></p></td>
     <td data-lake-id="u91dcf22b" id="u91dcf22b" style="vertical-align: middle">
      <p data-lake-id="u53e1f175" id="u53e1f175"><span data-lake-id="u21bc1742" id="u21bc1742">byte</span></p></td>
     <td data-lake-id="u9da98644" id="u9da98644" style="vertical-align: middle">
      <p data-lake-id="ud1f803bd" id="ud1f803bd"><span data-lake-id="u644ab481" id="u644ab481">Byte</span></p></td>
     <td data-lake-id="ue761c1d2" id="ue761c1d2" style="vertical-align: middle">
      <p data-lake-id="u56f2a965" id="u56f2a965"><span data-lake-id="u1f6e7b53" id="u1f6e7b53">1字节</span></p></td>
     <td data-lake-id="u85dc90a2" id="u85dc90a2" style="vertical-align: middle">
      <p data-lake-id="uee93c10c" id="uee93c10c"><span data-lake-id="uf07cb568" id="uf07cb568">-128 到 127</span></p></td>
    </tr>
    <tr data-lake-id="u5ef9ab66" id="u5ef9ab66">
     <td data-lake-id="udd70b7cf" id="udd70b7cf" style="vertical-align: middle">
      <p data-lake-id="ub725e0fe" id="ub725e0fe"><span data-lake-id="ub1796a40" id="ub1796a40">short</span></p></td>
     <td data-lake-id="u90fd163b" id="u90fd163b" style="vertical-align: middle">
      <p data-lake-id="u0c795cc3" id="u0c795cc3"><span data-lake-id="u42e7ddec" id="u42e7ddec">Short</span></p></td>
     <td data-lake-id="u81faa840" id="u81faa840" style="vertical-align: middle">
      <p data-lake-id="uf7840e3c" id="uf7840e3c"><span data-lake-id="uc31473a2" id="uc31473a2">2字节</span></p></td>
     <td data-lake-id="ue1f31821" id="ue1f31821" style="vertical-align: middle">
      <p data-lake-id="ud2bcba8a" id="ud2bcba8a"><span data-lake-id="ua4436764" id="ua4436764">-32,768 到 32,767</span><span data-lake-id="uc466cddf" id="uc466cddf">​</span></p></td>
    </tr>
    <tr data-lake-id="uccc05ca6" id="uccc05ca6">
     <td data-lake-id="ufc18c38e" id="ufc18c38e" style="vertical-align: middle">
      <p data-lake-id="u7bb29268" id="u7bb29268"><span data-lake-id="u35bec8c9" id="u35bec8c9">int</span></p></td>
     <td data-lake-id="ufd7f6c03" id="ufd7f6c03" style="vertical-align: middle">
      <p data-lake-id="u0d41fb4e" id="u0d41fb4e"><span data-lake-id="u7352b478" id="u7352b478">Integer</span></p></td>
     <td data-lake-id="u4fa7bb89" id="u4fa7bb89" style="vertical-align: middle">
      <p data-lake-id="uae73ed71" id="uae73ed71"><span data-lake-id="u90aa4607" id="u90aa4607">4字节</span></p></td>
     <td data-lake-id="u42a6551c" id="u42a6551c" style="vertical-align: middle">
      <p data-lake-id="ub3926721" id="ub3926721"><span data-lake-id="u94d926a8" id="u94d926a8">-2,147,483,648 到 2,147,483,647</span></p></td>
    </tr>
    <tr data-lake-id="ua79983de" id="ua79983de">
     <td data-lake-id="ue8088606" id="ue8088606" style="vertical-align: middle">
      <p data-lake-id="u9fab258c" id="u9fab258c"><span data-lake-id="ub7dc46c5" id="ub7dc46c5">long</span></p></td>
     <td data-lake-id="u2a6556b3" id="u2a6556b3" style="vertical-align: middle">
      <p data-lake-id="u6c163316" id="u6c163316"><span data-lake-id="ue2b6248c" id="ue2b6248c">Long</span></p></td>
     <td data-lake-id="ub1a59e9a" id="ub1a59e9a" style="vertical-align: middle">
      <p data-lake-id="u30a7434b" id="u30a7434b"><span data-lake-id="u6a47627c" id="u6a47627c">8字节</span></p></td>
     <td data-lake-id="u8b7dfcdb" id="u8b7dfcdb" style="vertical-align: middle">
      <p data-lake-id="uab29021e" id="uab29021e"><span data-lake-id="u3cc31ed0" id="u3cc31ed0">-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807</span></p></td>
    </tr>
    <tr data-lake-id="ub902715a" id="ub902715a">
     <td data-lake-id="u08f9d1d4" id="u08f9d1d4" style="vertical-align: middle">
      <p data-lake-id="u527335e4" id="u527335e4"><span data-lake-id="u3a15acb0" id="u3a15acb0">字符型</span></p></td>
     <td data-lake-id="u84ca90aa" id="u84ca90aa" style="vertical-align: middle">
      <p data-lake-id="u7e7139e5" id="u7e7139e5"><span data-lake-id="u70abf114" id="u70abf114">char</span></p></td>
     <td data-lake-id="uaa01d53b" id="uaa01d53b" style="vertical-align: middle">
      <p data-lake-id="u2834684a" id="u2834684a"><span data-lake-id="ue2a0371f" id="ue2a0371f">Character</span></p></td>
     <td data-lake-id="u52fb4be3" id="u52fb4be3" style="vertical-align: middle">
      <p data-lake-id="u0e318172" id="u0e318172"><span data-lake-id="u0fb91ac4" id="u0fb91ac4">2字节</span></p></td>
     <td data-lake-id="u025d44c3" id="u025d44c3" style="vertical-align: middle">
      <p data-lake-id="u5f9331dd" id="u5f9331dd"><span data-lake-id="u62944b7a" id="u62944b7a">Unicode字符集中的任何字符</span></p></td>
    </tr>
    <tr data-lake-id="ua8697533" id="ua8697533">
     <td data-lake-id="u12011a0b" id="u12011a0b" rowspan="2" style="vertical-align: middle">
      <p data-lake-id="u8c46ee62" id="u8c46ee62"><span data-lake-id="u1d0965e1" id="u1d0965e1">浮点型</span></p></td>
     <td data-lake-id="u66bdc2f5" id="u66bdc2f5" style="vertical-align: middle">
      <p data-lake-id="u543fd4cd" id="u543fd4cd"><span data-lake-id="u1099641d" id="u1099641d">float</span></p></td>
     <td data-lake-id="ud831b7fc" id="ud831b7fc" style="vertical-align: middle">
      <p data-lake-id="u96dad4d3" id="u96dad4d3"><span data-lake-id="u09701685" id="u09701685">Float</span></p></td>
     <td data-lake-id="u9103845a" id="u9103845a" style="vertical-align: middle">
      <p data-lake-id="uf4b561cf" id="uf4b561cf"><span data-lake-id="u93dab31c" id="u93dab31c">4字节</span></p></td>
     <td data-lake-id="u16f3dafe" id="u16f3dafe" style="vertical-align: middle">
      <p data-lake-id="u455eeaf7" id="u455eeaf7"><span data-lake-id="u9c312385" id="u9c312385">约 -3.4E38 到 3.4E38</span></p></td>
    </tr>
    <tr data-lake-id="u50da00b7" id="u50da00b7">
     <td data-lake-id="u8147121e" id="u8147121e" style="vertical-align: middle">
      <p data-lake-id="ue75b1017" id="ue75b1017"><span data-lake-id="ud8e4d5d7" id="ud8e4d5d7">double</span></p></td>
     <td data-lake-id="u365f49d4" id="u365f49d4" style="vertical-align: middle">
      <p data-lake-id="udaf6e7bd" id="udaf6e7bd"><span data-lake-id="u40ef5da6" id="u40ef5da6">Double</span></p></td>
     <td data-lake-id="uf616bd13" id="uf616bd13" style="vertical-align: middle">
      <p data-lake-id="u23f6d253" id="u23f6d253"><span data-lake-id="u44591e17" id="u44591e17">8字节</span></p></td>
     <td data-lake-id="u6342a683" id="u6342a683" style="vertical-align: middle">
      <p data-lake-id="u8b03c8d5" id="u8b03c8d5"><span data-lake-id="u545bd653" id="u545bd653">约 -1.7E308 到 1.7E308</span></p></td>
    </tr>
   </tbody>
  </table>
  <p data-lake-id="ue2c5a8b6" id="ue2c5a8b6"><span data-lake-id="ud971d921" id="ud971d921">​</span><br></p>
  <p data-lake-id="u3dca22e2" id="u3dca22e2"><strong><span data-lake-id="uf3b7fda5" id="uf3b7fda5">因为Java是一种面向对象语言，很多地方都需要使用对象而不是基本数据类型</span></strong><span data-lake-id="u58d2cc0a" id="u58d2cc0a">。比如，在集合类中，我们是无法将int 、double等类型放进去的。因为集合的容器要求元素是Object类型。</span></p>
  <p data-lake-id="u692ecec0" id="u692ecec0"><span data-lake-id="ud263bad2" id="ud263bad2">​</span><br></p>
  <p data-lake-id="ud804dd1d" id="ud804dd1d"><span data-lake-id="u82154fe2" id="u82154fe2">为了让基本类型也具有对象的特征，就出现了包装类型，它相当于将基本类型“包装起来”，使得它具有了对象的性质，并且为其添加了属性和方法，丰富了基本类型的操作。<br><br></span></p>
  <p data-lake-id="ua8e2e259" id="ua8e2e259"><br></p>
  <h1 data-lake-id="tWkAj" id="tWkAj"><span data-lake-id="u4eb38928" id="u4eb38928">知识扩展</span></h1>
  <p data-lake-id="ua2d6a073" id="ua2d6a073"><br></p>
  <h2 data-lake-id="SobwH" id="SobwH"><span data-lake-id="ufb8fc0cf" id="ufb8fc0cf" style="color: var(--yq-text-primary)">基本类型和包装类型的区别</span></h2>
  <p data-lake-id="u6fc83b80" id="u6fc83b80"><br></p>
  <ol list="ufc526a76">
   <li fid="u6fb7dd15" data-lake-id="ueb16a0a2" id="ueb16a0a2"><span data-lake-id="ub6bd58f0" id="ub6bd58f0" style="color: var(--yq-text-primary)">默认值不同，基本类型的默认值为0, false或\u0000等，包装类默认为null</span></li>
   <li fid="u6fb7dd15" data-lake-id="uf5f729f7" id="uf5f729f7"><span data-lake-id="u93f156d3" id="u93f156d3" style="color: var(--yq-text-primary)">初始化方式不同，一个需要new，一个不需要</span></li>
   <li fid="u6fb7dd15" data-lake-id="u20c7be52" id="u20c7be52"><span data-lake-id="u9ee6bdaa" id="u9ee6bdaa" style="color: var(--yq-text-primary)">存储方式不同，基本类型保存在栈上，包装类对象保存在堆上（成员变量的话，在不考虑JIT优化的栈上分配时，都是随着对象一起保存在堆上的）</span></li>
  </ol>
  <p data-lake-id="ue8de9095" id="ue8de9095"><br></p>
  <h2 data-lake-id="xiq4R" id="xiq4R"><span data-lake-id="uc5320477" id="uc5320477">接口定义中应该用什么？</span></h2>
  <p data-lake-id="u365f8b9f" id="u365f8b9f"><br></p>
  <h2 data-lake-id="OaVkE" id="OaVkE"><span data-lake-id="udb73520b" id="udb73520b">如何理解自动拆装箱</span></h2>
  <h3 data-lake-id="kwLPv" id="kwLPv"><span data-lake-id="udc0165b0" id="udc0165b0">拆箱与装箱</span></h3>
  <p data-lake-id="u7c3644b0" id="u7c3644b0" style="text-align: justify"><span data-lake-id="u2f9d903e" id="u2f9d903e" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">包装类是对基本类型的包装，所以，把基本数据类型转换成包装类的过程就是</span><strong><span data-lake-id="ub62f68aa" id="ub62f68aa" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">装箱</span></strong><span data-lake-id="u013823f8" id="u013823f8" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">；反之，把包装类转换成基本数据类型的过程就是</span><strong><span data-lake-id="uab4ecc45" id="uab4ecc45" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">拆箱</span></strong><span data-lake-id="u9db5fd21" id="u9db5fd21" class="lake-fontsize-12" style="color: rgb(85, 85, 85)">。</span></p>
  <h3 data-lake-id="a2vwU" id="a2vwU"><span data-lake-id="u56068247" id="u56068247">自动拆装箱</span></h3>
  <p data-lake-id="u917b1616" id="u917b1616"><span data-lake-id="uecb215c8" id="uecb215c8" style="color: rgb(85, 85, 85)">在Java SE5中，为了减少开发人员的工作，Java提供了自动拆箱与自动装箱功能。</span></p>
  <p data-lake-id="u0b1c4250" id="u0b1c4250"><span data-lake-id="u13666fd0" id="u13666fd0" style="color: rgb(85, 85, 85)">​</span><br></p>
  <p data-lake-id="ub5f4e71a" id="ub5f4e71a" style="text-align: justify"><span data-lake-id="ue2ae870c" id="ue2ae870c" style="color: rgb(85, 85, 85)">自动装箱: 就是将基本数据类型自动转换成对应的包装类。</span></p>
  <p data-lake-id="u37923fee" id="u37923fee" style="text-align: justify"><span data-lake-id="u3fc7cf6e" id="u3fc7cf6e" style="color: rgb(85, 85, 85)">​</span><br></p>
  <p data-lake-id="uf3bf9959" id="uf3bf9959" style="text-align: justify"><span data-lake-id="u19159442" id="u19159442" style="color: rgb(85, 85, 85)">自动拆箱：就是将包装类自动转换成对应的基本数据类型。</span></p>
  <pre lang="java"><code>
Integer i =10;  //自动装箱
int b= i;     //自动拆箱
</code></pre>
  <h3 data-lake-id="lEiH0" id="lEiH0"><span data-lake-id="ua3525713" id="ua3525713">自动拆装箱原理</span></h3>
  <p data-lake-id="u3aebe436" id="u3aebe436"><span data-lake-id="uc9abfb96" id="uc9abfb96">自动装箱都是通过包装类的</span><code data-lake-id="u53105202" id="u53105202"><span data-lake-id="u19bf8530" id="u19bf8530">valueOf()</span></code><span data-lake-id="ud0ffa897" id="ud0ffa897">方法来实现的.自动拆箱都是通过包装类对象的</span><code data-lake-id="u9606c95b" id="u9606c95b"><span data-lake-id="u012d25e3" id="u012d25e3">xxxValue()</span></code><span data-lake-id="udba1879d" id="udba1879d">来实现的。</span></p>
  <p data-lake-id="u9e5ca99e" id="u9e5ca99e"><span data-lake-id="ufae073d7" id="ufae073d7">​</span><br></p>
  <p data-lake-id="u82330a7d" id="u82330a7d"><span data-lake-id="u01e6a036" id="u01e6a036">如：int的自动装箱都是通过</span><code data-lake-id="uc84a44b0" id="uc84a44b0"><span data-lake-id="ua9519053" id="ua9519053">Integer.valueOf()</span></code><span data-lake-id="u35d34651" id="u35d34651">方法来实现的，Integer的自动拆箱都是通过</span><code data-lake-id="u5524ab05" id="u5524ab05"><span data-lake-id="u257d1af9" id="u257d1af9">Integer.intValue()</span></code><span data-lake-id="u2b7603e9" id="u2b7603e9">来实现的。</span></p>
  <h2 data-lake-id="Q5ekG" id="Q5ekG"><span data-lake-id="u27550ca3" id="u27550ca3">哪些地方会自动拆装箱</span></h2>
  <p data-lake-id="ucbd04083" id="ucbd04083"><br></p>
  <p data-lake-id="ube7c0562" id="ube7c0562"><span data-lake-id="ub34fe691" id="ub34fe691">我们了解过原理之后，再来看一下，什么情况下，Java会帮我们进行自动拆装箱。前面提到的变量的初始化和赋值的场景就不介绍了，那是最简单的也最容易理解的。</span></p>
  <p data-lake-id="u3e0e7e62" id="u3e0e7e62"><br></p>
  <p data-lake-id="uddef5c27" id="uddef5c27"><span data-lake-id="ue05c279e" id="ue05c279e">我们主要来看一下，那些可能被忽略的场景。</span></p>
  <p data-lake-id="u102f0a50" id="u102f0a50"><br></p>
  <h3 data-lake-id="ZhwKm" id="ZhwKm"><span data-lake-id="u3363f66e" id="u3363f66e">场景一、将基本数据类型放入集合类</span></h3>
  <p data-lake-id="u898a3ea8" id="u898a3ea8"><br></p>
  <p data-lake-id="u80a20aa3" id="u80a20aa3"><span data-lake-id="uba2c5d2e" id="uba2c5d2e">我们知道，Java中的集合类只能接收对象类型，那么以下代码为什么会不报错呢？</span></p>
  <p data-lake-id="u07ada868" id="u07ada868"><br></p>
  <pre lang="java"><code>
List&lt;Integer&gt; li = new ArrayList&lt;&gt;();
for (int i = 1; i &lt; 50; i ++){
    li.add(i);
}
</code></pre>
  <p data-lake-id="u9ef51252" id="u9ef51252"><br></p>
  <p data-lake-id="u1a68c26b" id="u1a68c26b"><span data-lake-id="u07953ce0" id="u07953ce0">将上面代码进行反编译，可以得到以下代码：</span></p>
  <p data-lake-id="uf03e965b" id="uf03e965b"><br></p>
  <pre lang="java"><code>
List&lt;Integer&gt; li = new ArrayList&lt;&gt;();
for (int i = 1; i &lt; 50; i ++){
    li.add(Integer.valueOf(i));
}
</code></pre>
  <p data-lake-id="ud1fa7bbe" id="ud1fa7bbe"><br></p>
  <p data-lake-id="u8c27448b" id="u8c27448b"><span data-lake-id="u3bc49b45" id="u3bc49b45">以上，我们可以得出结论，当我们把基本数据类型放入集合类中的时候，会进行自动装箱。</span></p>
  <p data-lake-id="ub7d401e7" id="ub7d401e7"><br></p>
  <h3 data-lake-id="FlmPu" id="FlmPu"><span data-lake-id="u6cd9f376" id="u6cd9f376">场景二、包装类型和基本类型的大小比较</span></h3>
  <p data-lake-id="u5c3a1132" id="u5c3a1132"><br></p>
  <p data-lake-id="u9cefc44c" id="u9cefc44c"><span data-lake-id="u7c50c206" id="u7c50c206">有没有人想过，当我们对Integer对象与基本类型进行大小比较的时候，实际上比较的是什么内容呢？看以下代码：</span></p>
  <p data-lake-id="uc46620c8" id="uc46620c8"><br></p>
  <pre lang="java"><code>
Integer a=1;
System.out.println(a==1?"等于":"不等于");
Boolean bool=false;
System.out.println(bool?"真":"假");
</code></pre>
  <p data-lake-id="u746a9ea8" id="u746a9ea8"><br></p>
  <p data-lake-id="u0c0ad2b9" id="u0c0ad2b9"><span data-lake-id="u067047a3" id="u067047a3">对以上代码进行反编译，得到以下代码：</span></p>
  <p data-lake-id="ucc536a7d" id="ucc536a7d"><br></p>
  <pre lang="java"><code>
Integer a=1;
System.out.println(a.intValue()==1?"等于":"不等于");
Boolean bool=false;
System.out.println(bool.booleanValue?"真":"假");
</code></pre>
  <p data-lake-id="u66310324" id="u66310324"><br></p>
  <p data-lake-id="ubfa382dc" id="ubfa382dc"><span data-lake-id="uf4eaef97" id="uf4eaef97">可以看到，包装类与基本数据类型进行比较运算，是先将包装类进行拆箱成基本数据类型，然后进行比较的。</span></p>
  <p data-lake-id="u36ebcfdf" id="u36ebcfdf"><br></p>
  <h3 data-lake-id="JSg0y" id="JSg0y"><span data-lake-id="u00335413" id="u00335413">场景三、包装类型的运算</span></h3>
  <p data-lake-id="u38ef99bb" id="u38ef99bb"><br></p>
  <p data-lake-id="ufcbba453" id="ufcbba453"><span data-lake-id="u01a14433" id="u01a14433">有没有人想过，当我们对Integer对象进行四则运算的时候，是如何进行的呢？看以下代码：</span></p>
  <p data-lake-id="u33f46ab9" id="u33f46ab9"><br></p>
  <pre lang="java"><code>
Integer i = 10;
Integer j = 20;

System.out.println(i+j);
</code></pre>
  <p data-lake-id="u40a5d012" id="u40a5d012"><br></p>
  <p data-lake-id="uaf79d341" id="uaf79d341"><span data-lake-id="u4cc0b4ad" id="u4cc0b4ad">反编译后代码如下：</span></p>
  <p data-lake-id="u12aebfbe" id="u12aebfbe"><br></p>
  <pre lang="java"><code>
Integer i = Integer.valueOf(10);
Integer j = Integer.valueOf(20);
System.out.println(i.intValue() + j.intValue());
</code></pre>
  <p data-lake-id="ueb7d4ec4" id="ueb7d4ec4"><br></p>
  <p data-lake-id="ub2c33ced" id="ub2c33ced"><span data-lake-id="ub66f497e" id="ub66f497e">我们发现，两个包装类型之间的运算，会被自动拆箱成基本类型进行。</span></p>
  <p data-lake-id="u9a3db5f8" id="u9a3db5f8"><br></p>
  <h3 data-lake-id="vKav2" id="vKav2"><span data-lake-id="ud55e163d" id="ud55e163d">场景四、三目运算符的使用</span></h3>
  <p data-lake-id="u7c078f4f" id="u7c078f4f"><br></p>
  <p data-lake-id="u56c145a6" id="u56c145a6"><span data-lake-id="u643f112a" id="u643f112a">这是很多人不知道的一个场景，作者也是一次线上的血淋淋的Bug发生后才了解到的一种案例。看一个简单的三目运算符的代码：</span></p>
  <p data-lake-id="u9b0474e0" id="u9b0474e0"><br></p>
  <pre lang="java"><code>
boolean flag = true; //设置成true，保证条件表达式的表达式二一定可以执行
boolean simpleBoolean = false; //定义一个基本数据类型的boolean变量
Boolean nullBoolean = null;//定义一个包装类对象类型的Boolean变量，值为null

boolean x = flag ? nullBoolean : simpleBoolean; //使用三目运算符并给x变量赋值
</code></pre>
  <p data-lake-id="u2cf5da14" id="u2cf5da14"><br></p>
  <p data-lake-id="uab0e9d82" id="uab0e9d82"><span data-lake-id="u7e8e7634" id="u7e8e7634">很多人不知道，其实在</span><code data-lake-id="u5801238b" id="u5801238b"><span data-lake-id="u0a6ab9ba" id="u0a6ab9ba">int k = flag ? i : j;</span></code><span data-lake-id="u2078fbbd" id="u2078fbbd">这一行，会发生自动拆箱。反编译后代码如下：</span></p>
  <p data-lake-id="uf14fcae0" id="uf14fcae0"><br></p>
  <pre lang="java"><code>
boolean flag = true;
boolean simpleBoolean = false;
Boolean nullBoolean = null;
boolean x = flag ? nullBoolean.booleanValue() : simpleBoolean;
</code></pre>
  <p data-lake-id="ue9f66d46" id="ue9f66d46"><br></p>
  <p data-lake-id="u4d1ae620" id="u4d1ae620"><span data-lake-id="uab391053" id="uab391053">这其实是三目运算符的语法规范。当第二，第三位操作数分别为基本类型和对象时，其中的对象就会拆箱为基本类型进行操作。</span></p>
  <p data-lake-id="ua9a4e4a2" id="ua9a4e4a2"><br></p>
  <p data-lake-id="ua0f17e1f" id="ua0f17e1f"><span data-lake-id="u56cb3255" id="u56cb3255">可以看到，反编译后的代码的最后一行，编译器帮我们做了一次自动拆箱，而就是因为这次自动拆箱，导致代码出现对于一个null对象（nullBoolean.booleanValue()）的调用，导致了NPE。</span></p>
  <p data-lake-id="u5fe820ef" id="u5fe820ef"><br></p>
  <h3 data-lake-id="x1Nt2" id="x1Nt2"><span data-lake-id="u016a6915" id="u016a6915">场景五、函数参数与返回值</span></h3>
  <p data-lake-id="u042084d8" id="u042084d8"><br></p>
  <p data-lake-id="u3387f5ba" id="u3387f5ba"><span data-lake-id="u4d62d563" id="u4d62d563">这个比较容易理解，直接上代码了：</span></p>
  <p data-lake-id="u763b0fed" id="u763b0fed"><br></p>
  <pre lang="java"><code>
//自动拆箱
public int getNum1(Integer num) {
return num;
}
//自动装箱
public Integer getNum2(int num) {
return num;
}
</code></pre>
  <p data-lake-id="u5b6413e9" id="u5b6413e9"><br></p>
  <h2 data-lake-id="16b7b4e2" id="16b7b4e2"><span data-lake-id="ubc47a33c" id="ubc47a33c">自动拆装箱与缓存</span></h2>
  <p data-lake-id="ufa68c3aa" id="ufa68c3aa"><br></p>
  <p data-lake-id="u1a41fee0" id="u1a41fee0"><span data-lake-id="ua342f127" id="ua342f127">Java SE的自动拆装箱还提供了一个和缓存有关的功能，我们先来看以下代码，猜测一下输出结果：</span></p>
  <p data-lake-id="uea18d73f" id="uea18d73f"><br></p>
  <pre lang="java"><code>
public static void main(String... strings) {

    Integer integer1 = 3;
    Integer integer2 = 3;

    if (integer1 == integer2)
        System.out.println("integer1 == integer2");
    else
        System.out.println("integer1 != integer2");

    Integer integer3 = 300;
    Integer integer4 = 300;

    if (integer3 == integer4)
        System.out.println("integer3 == integer4");
    else
        System.out.println("integer3 != integer4");

}
</code></pre>
  <p data-lake-id="u78818f36" id="u78818f36"><br></p>
  <p data-lake-id="u98dedeba" id="u98dedeba"><span data-lake-id="u4f9dcb01" id="u4f9dcb01">我们普遍认为上面的两个判断的结果都是false。虽然比较的值是相等的，但是由于比较的是对象，而对象的引用不一样，所以会认为两个if判断都是false的。在Java中，==比较的是对象引用，而equals比较的是值。所以，在这个例子中，不同的对象有不同的引用，所以在进行比较的时候都将返回false。奇怪的是，这里两个类似的if条件判断返回不同的布尔值。</span></p>
  <p data-lake-id="u0c693ed7" id="u0c693ed7"><br></p>
  <p data-lake-id="udb61b1c6" id="udb61b1c6"><span data-lake-id="ud5d604fd" id="ud5d604fd">上面这段代码真正的输出结果：</span></p>
  <p data-lake-id="u90359a46" id="u90359a46"><br></p>
  <pre lang="java"><code>
integer1 == integer2
integer3 != integer4
</code></pre>
  <p data-lake-id="u526be7d1" id="u526be7d1"><br></p>
  <p data-lake-id="u0ea60f6e" id="u0ea60f6e"><span data-lake-id="uda3ba83d" id="uda3ba83d">原因就和Integer中的缓存机制有关。在Java 5中，在Integer的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。</span></p>
  <p data-lake-id="u295d75de" id="u295d75de"><br></p>
  <blockquote data-lake-id="u03771722" id="u03771722">
   <p data-lake-id="u4abc34a4" id="u4abc34a4"><span data-lake-id="ucc1b226b" id="ucc1b226b">适用于整数值区间-128 至 +127。</span></p>
   <p data-lake-id="u14397c41" id="u14397c41"><span data-lake-id="u28e386c9" id="u28e386c9"> </span></p>
   <p data-lake-id="u4bcb13b3" id="u4bcb13b3"><span data-lake-id="ue950a402" id="ue950a402">只适用于自动装箱。使用构造函数创建对象不适用。</span></p>
  </blockquote>
  <p data-lake-id="ube3ecd57" id="ube3ecd57"><br></p>
  <p data-lake-id="ua9cba1bc" id="ua9cba1bc"><span data-lake-id="u441d05d2" id="u441d05d2">我们只需要知道，当需要进行自动装箱时，如果数字在-128至127之间时，会直接使用缓存中的对象，而不是重新创建一个对象。</span></p>
  <p data-lake-id="u985123cb" id="u985123cb"><br></p>
  <p data-lake-id="u7984a900" id="u7984a900"><span data-lake-id="u6323f8eb" id="u6323f8eb">其中的javadoc详细的说明了缓存支持-128到127之间的自动装箱过程。最大值127可以通过</span><code data-lake-id="ub74664b7" id="ub74664b7"><span data-lake-id="u487cf064" id="u487cf064">-XX:AutoBoxCacheMax=size</span></code><span data-lake-id="u20fc3df7" id="u20fc3df7">修改。</span></p>
  <p data-lake-id="u90a1fe95" id="u90a1fe95"><br></p>
  <p data-lake-id="uaed4288e" id="uaed4288e"><span data-lake-id="uf00f697d" id="uf00f697d">实际上这个功能在Java 5中引入的时候,范围是固定的-128 至 +127。后来在Java 6中，可以通过</span><code data-lake-id="ua310ef81" id="ua310ef81"><span data-lake-id="uf5f1f4ea" id="uf5f1f4ea">java.lang.Integer.IntegerCache.high</span></code><span data-lake-id="u955717b5" id="u955717b5">设置最大值。</span></p>
  <p data-lake-id="ub2cd3a9e" id="ub2cd3a9e"><br></p>
  <p data-lake-id="u2fcd823d" id="u2fcd823d"><span data-lake-id="u0cc3a277" id="u0cc3a277">这使我们可以根据应用程序的实际情况灵活地调整来提高性能。到底是什么原因选择这个-128到127范围呢？因为这个范围的数字是最被广泛使用的。 在程序中，第一次使用Integer的时候也需要一定的额外时间来初始化这个缓存。</span></p>
  <p data-lake-id="u99d06c6e" id="u99d06c6e"><br></p>
  <p data-lake-id="u42198b31" id="u42198b31"><span data-lake-id="u4bc3861e" id="u4bc3861e">在Boxing Conversion部分的Java语言规范(JLS)规定如下：</span></p>
  <p data-lake-id="ua4080592" id="ua4080592"><br></p>
  <p data-lake-id="u9bea6cac" id="u9bea6cac"><span data-lake-id="uc49827d6" id="uc49827d6">如果一个变量p的值是：</span></p>
  <p data-lake-id="u6a481c2c" id="u6a481c2c"><br></p>
  <pre lang="java"><code>
-128至127之间的整数(§3.10.1)

true 和 false的布尔值 (§3.10.3)

‘\u0000’至 ‘\u007f’之间的字符(§3.10.4)
</code></pre>
  <p data-lake-id="u9303993e" id="u9303993e"><br></p>
  <p data-lake-id="u19a7ff0d" id="u19a7ff0d"><span data-lake-id="u1c70893e" id="u1c70893e">范围内的时，将p包装成a和b两个对象时，可以直接使用a==b判断a和b的值是否相等。</span></p>
  <p data-lake-id="u924c971b" id="u924c971b"><br></p>
  <h3 data-lake-id="grFiK" id="grFiK"><span data-lake-id="u72d61be7" id="u72d61be7" style="color: var(--yq-text-primary)"><br><br></span></h3>
 </body>
</html>